package jdbc.core;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;

/**
 * @Author : LukeRen
 * @DateTime: 2022/2/8 16:31
 * @Description :
 * @Version : 1.0.0
 */
public class DataSourceManager {

    private volatile static DataSource instance;
    //锁
    private static Object lock = new Object();

    private DataSourceManager() {

    }

    /**
     * 数据库连接配置信息
     */
    private static final String JDBC_USER_NAME = "root";
    private static final String JDBC_PASSWORD = "123456";
    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/learn_mybatis";

    /**
     * JDBC 标准的连接池接口javax.sql.DataSource，实现连接池，需要实现这个接口
     * 有了连接池以后，我们如何使用它呢？和前面的代码类似，只是获取 Connection 时，把 DriverManage.getConnection() 改为 ds.getConnection()
     *
     * @return
     */
    public static DataSource getDataSource() {
        if (instance == null) {
            synchronized (lock) {
                if (instance == null) {
                    //配置连接池
                    HikariConfig config = new HikariConfig();
                    config.setJdbcUrl(JDBC_URL);
                    config.setDriverClassName("com.mysql.cj.jdbc.Driver");
                    config.setUsername(JDBC_USER_NAME);
                    config.setPassword(JDBC_PASSWORD);
//                    config.addDataSourceProperty("connectionTimeout", 1000); // 连接超时：1秒，这个网上的设置无效
                    config.addDataSourceProperty("idleTimeout", 60000); // 空闲超时：60秒
//                    config.addDataSourceProperty("maximumPoolSize", 1); // 最大连接数：10，这个网上的设置无效
                    config.setMaximumPoolSize(1); // 最大连接数1
                    config.setConnectionTimeout(10000L);
                    config.addDataSourceProperty("autoReconnect", true);
                    config.addDataSourceProperty("serverTimezone", "Asia/Shanghai");
                    config.addDataSourceProperty("useSSL", false); // 禁止使用ssl连接
                    instance = new HikariDataSource(config);
                }
            }
        }
        return instance;
    }

}
